package com.example.weibowebcrawlerdemo.controller;

import com.alibaba.excel.EasyExcel;
import com.example.weibowebcrawlerdemo.constant.ResultConstant;
import com.example.weibowebcrawlerdemo.entities.CommonResult;
import com.example.weibowebcrawlerdemo.pojo.Weibo;
import com.example.weibowebcrawlerdemo.utils.WeiboUtil;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;

@CrossOrigin
@RestController
public class HelloController {

    @Resource
    private WeiboUtil weiboUtil;

    /**
    * 获取经过爬虫处理后的 json数据
    * */
    @GetMapping("/getJson")
    public List<Weibo> getJson() {
        List<Weibo> list = weiboUtil.getList();
        if (list != null && list.size() != 0){
            return list;
        }
        return null;
    }

    /**
     * 使用关键字对微博接口进行爬取,若爬取成功则返回一个成功信息,
     * 只有本方法执行成功后,才可以对数据进行导出和查看
     * @param keyword 关键字,通过关键字爬取微博搜索页面中的数据
     * @param pageNum 页面数,爬取指定数量的页面数据
     * @return 返回一个响应对象,并不会携带数据(data)
     * */
    @GetMapping("/crawler/{keyword}/{pageNum}")
    public CommonResult crawler(@PathVariable String keyword,@PathVariable int pageNum) throws IOException {

        CommonResult result = new CommonResult();

        //检查前端传入的数据是否正常
        if (keyword == null || keyword.length() == 0 || keyword.contains(" ")){
            result.setCode(ResultConstant.Error.PARAM_ERROR);
            result.setMessage("Error 输入的关键字中有不合法的数据");
            return result;
        }
        if (pageNum<0 || pageNum > 16){
            result.setCode(ResultConstant.Error.PARAM_ERROR);
            result.setMessage("Error 爬取的页面不可小于1或者大于16");
            return result;
        }

        /*
        * 设置要爬取的页面数量,然后将关键字传入工具类进行爬取
        * */
        weiboUtil.setPageNum(pageNum);
        List<Weibo> weiboList = weiboUtil.getWeiboList(keyword);

        //检查工具类处理后的数据是否合法
        if (weiboList != null && weiboList.size() != 0){
            result.setCode(ResultConstant.SUCCESS);
            result.setMessage("success 数据爬取成功,可以查看JSON或者导出Excel了");
            return result;
        }

        //数据不合法,返回错误信息
        result.setCode(ResultConstant.Error.CRAWLER_ERROR);
        result.setMessage("Error 数据爬取失败");
        return result;
    }


    /**
     * 用户必须处理了crawler请求,获得了正常的数据,该方法才可以执行
     * 将爬取后获得的一个集合对象通过 EasyExcel 转换为Excel表格返回给前端页面
     * @param response 需要一个response对象,将Excel表格导出
     * @return 返回一个响应对象,只携带信息,并不会携带数据(data)
    * */
    @GetMapping("/getExcel")
    public CommonResult getExcel(HttpServletResponse response){

        CommonResult result = new CommonResult();
        List<Weibo> list = weiboUtil.getList();

        //判断爬取数据是否成功
        if (list == null || list.size() < 1) {
            result.setCode(ResultConstant.Error.USE_ERROR);
            result.setMessage("Error 操作失败, 并未对数据进行爬取,无法获得Excel表格");
            return result;
        }

        //创建一个临时文件对象
        File file = null;
        try {
            //临时文件对象以 temp(临时)为开头 .xlsx(Excel表格文件)为后缀
            file = File.createTempFile("temp", ".xlsx");
        } catch (IOException e) {
            e.printStackTrace();
        }

        //使用EasyExcel对学生表数据进行
        EasyExcel.write(file,Weibo.class).sheet("学生表").doWrite(list);

        //设置响应头的类型
        //response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setContentType("application/vnd.ms-excel");
        //让浏览器下载文件,name是上述默认文件下载名
        response.addHeader("Content-Disposition","attachment;filename=\"" + file.getName() + "\"");

        InputStream inputStream=null;
        OutputStream outputStream=null;
        try {
            inputStream = new FileInputStream(file);
            outputStream = response.getOutputStream();

            int len = -1;
            byte[] buffer = new byte[1024];

            while ((len = inputStream.read(buffer)) !=-1){
                outputStream.write(buffer);
            }
            outputStream.flush();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭输入输出流
            try {
                if(inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            //删除临时文件
            file.delete();
        }

        result.setCode(ResultConstant.SUCCESS);
        result.setMessage("success 操作成功,已导出Excel");
        return result;

    }



}
